home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 09 - 1993 / 09.10 Oct 93 / THINK Top 10 / JGNE installer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-16  |  2.1 KB  |  63 lines  |  [TEXT/KAHL]

  1. // generic JGNE init.c, by Kevin Irlen, Symantec Corp. 7/93
  2.  
  3. /*
  4.  Create a project of type Code Resource.  Set Type to INIT, ID to 0, and check the "Locked" 
  5.  and "System Heap" attributes.  Optionally, set Creator to RSED and File Type 
  6.  to rsrc so you can open this with ResEdit.  Add this file and "Show INIT Icon.c".
  7.  
  8.  Add your JGNE 'CODE' resource, your icon resource(s), and any other needed resources 
  9.  to the built 'INIT' resource file.
  10. */
  11.  
  12. /*
  13.  We must overwrite the dummy instruction in the JGNE 'CODE' resource that  
  14.  does not "know" ahead of time whether it will have to branch to a previously loaded
  15.  JGNE filter.  Determining the location of the dummy instruction and overwriting it with
  16.  the proper instruction works like this:
  17.  
  18.  At kBRAoffset will be the branch instruction leading to "main".  The second word of that 
  19.  instruction is the number of bytes to branch over.  From "main", it will be kLoadOffset 
  20.  bytes to the line which loads the address of the current JGNE filter if there is one, or 
  21.  writes a simple RTS (0x4E75) if there isn't.
  22. */
  23.  
  24. #define rMyINITIcon -4094           // ID of icon to be shown at INIT time
  25. #define rMyJGNE       128           // ID of JGNE 'CODE' resource         
  26.  
  27. #define kBRAoffset  0x0018          // offset of bra to "main" in a standard header CODE resource
  28. #define kLoadOffset 0x0014          // offset in "main" of the line to be changed!
  29.  
  30. Ptr JGNEFilterPtr : 0x29A;          // low-memory global JGNEfilter
  31.  
  32. OSErr ShowInitIcon(short icon_num,short move_x_by);
  33.  
  34. main()
  35. {
  36.  Handle  myJGNE;
  37.  Ptr     branInstruction,loadInstruction;
  38.  OSErr   iErr;
  39.  
  40.  SetZone(SysZone);
  41.  
  42.  myJGNE = Get1Resource('CODE',rMyJGNE);
  43.  
  44.  if (myJGNE)
  45.  {
  46.   DetachResource(myJGNE);
  47.  
  48.   branInstruction = *myJGNE         + kBRAoffset;
  49.   loadInstruction = branInstruction + *((short *) (branInstruction + 2)) + kLoadOffset;
  50.   
  51.   if (JGNEFilterPtr) *((long *) (loadInstruction + 2)) = (long) JGNEFilterPtr;
  52.   else               *loadInstruction                  = 0x4E75;
  53.   
  54.   JGNEFilterPtr = *myJGNE;
  55.  }
  56.  else SysBeep(10);
  57.  
  58.  iErr = ShowInitIcon(rMyINITIcon,-1);
  59.  
  60.  if (iErr != noErr) SysBeep(10);
  61. }
  62.  
  63.